use crossterm::event::{KeyEvent, KeyModifiers};
use crossterm::terminal::{enable_raw_mode, disable_raw_mode};
use crossterm::event::{read, Event::Key, KeyCode::Char};

pub struct Editor{
    should_quie:bool,
}

impl Editor{
    pub fn new() -> Self{
        Editor { 
            should_quie: false
         }
    }

    pub fn run(&mut self)
    {
        if let Err(err) = self.repl()
        {
            panic!("{err:#?}");
        }
        println!("goodby\r");
        
    }


    fn repl(& mut self) -> Result<(), std::io::Error>
    {
        enable_raw_mode()?;

        loop
        {
            // read 读取一个按键事件
            // 打印按键事件，这个事件应该已经做了debug派生
            // {:?} 是按照紧凑形式输出，{:#?}是按照格式化输出，带有换行等
            // event.code 获取这个键值本身，是方向键、数字或字母键等
            // 然后 Char(...) 是判断 这个键值是 字符类型 
            if let Key( 
                KeyEvent // 将整个结构体的成员都解构出来，分配到独立变量中，如果不想使用原来的变量名作为独立变量名，可以用这样的方式进行修改： code: my_code
                {
                    code,
                    modifiers, 
                    kind, 
                    state
                }) = read()?
            {
                println!(" Code:{code:#?}, Modifers {modifiers:#?}, kind{kind:#?}, state{state:#?} \r");

                match code 
                {
                    Char('c') if modifiers == KeyModifiers::CONTROL =>
                    {
                        self.should_quie = true;
                        
                    }

                    _ => ()
                }
            }

            if self.should_quie 
            {
                break;
            }
        }
        disable_raw_mode()?;
        Ok(())

    }
    







}




